﻿using System;
using System.Windows.Forms;

namespace ShareHelper
{
    /// <summary>
    ///
    /// </summary>
    public static class ControlExtensions
    {
        /// <summary>
        ///  在创建控件的基础句柄所在线程上异步执行指定委托。
        /// </summary>
        /// <param name="control"></param>
        /// <param name="method">  对不带参数的方法的委托。</param>
        /// <param name="isWait">是否等待委托事件执行完毕</param>
        public static void BeginInvokeEx(this Control control, Delegate method, bool isWait = false)
        {
            BeginInvokeEx(control, method, isWait, null);
        }

        /// <summary>
        /// 在创建控件的基础句柄所在线程上，用指定的自变量异步执行指定委托。
        /// </summary>
        /// <param name="control"></param>
        /// <param name="method">一个方法委托，它采用的参数的数量和类型与 args 参数中所包含的相同。</param>
        /// <param name="isWait">是否等待委托事件执行完毕</param>
        /// <param name="args">作为给定方法的参数传递的对象数组。 如果不需要自变量，则可以为 null。</param>
        public static void BeginInvokeEx(this Control control, Delegate method, bool isWait = false, params object[] args)
        {
            if (control?.IsDisposed == false)
            {
                if (control.InvokeRequired)
                {
                    var result = control.BeginInvoke(method, args);
                    if (isWait)
                        result.AsyncWaitHandle.WaitOne();
                }
                else
                    method.DynamicInvoke(args);
            }
        }
    }
}